class SpecTag
  attr_accessor :tag, :comment, :description

  def initialize(string=nil)
    parse(string) if string
  end

  def parse(string)
    m = /^([^()#:]+)(\(([^)]+)?\))?:(.*)$/.match string
    @tag, @comment, description = m.values_at(1, 3, 4) if m
    @description = unescape description
  end

  def unescape(str)
    return unless str
    str = str[1..-2] if str[0] == ?" and str[-1] == ?"
    str.gsub(/(\\\\)|(\\n)/) { |x| x == "\\\\" ? "\\" : "\n" }
  end

  def escape(str)
    str.gsub(/[\\\n]/) { |x| x == "\\" ? "\\\\" : "\\n" }
  end

  def to_s
    "#{@tag}#{ "(#{@comment})" if @comment }:#{escape @description}"
  end

  def ==(o)
    @tag == o.tag and @comment == o.comment and @description == o.description
  end
end
